package config

import (
	"context"     // 引入上下文包，用于提供异步处理能力及超时控制
	"sync/atomic" // 引入原子操作包，实现对状态变量进行线程安全的操作
)

// Control 接口定义了配置管理器所需的所有功能。
type Control interface {
	RequestPause(ctx context.Context) error  // 请求暂停配置管理器的运行。
	RequestResume(ctx context.Context) error // 请求恢复配置管理器的运行。
	PauseSignal() <-chan struct{}            // 返回一个通道，当配置管理器处于暂停状态时接收信号。
	ResumeSignal() <-chan struct{}           // 返回一个通道，当配置管理器从暂停状态恢复时接收信号。
}

// RequestPause 方法被调用以切换配置管理器到暂停状态。
func (t *Config) RequestPause(ctx context.Context) error {
	if atomic.CompareAndSwapInt32(&t.state, stateNormal, statePause) { // 使用原子操作来设置状态，如果成功则广播回调到请求者
		return t.signalPause.Broadcast(ctx)
	} else {
		return ErrorInvalidState.New(nil) // 如果状态已改变（比如已经暂停），返回错误指示无效的状态转换
	}
}

// RequestResume 方法被调用以切换配置管理器从暂停状态恢复。
func (t *Config) RequestResume(ctx context.Context) error {
	if atomic.CompareAndSwapInt32(&t.state, statePause, stateNormal) { // 使用原子操作来设置状态，如果成功则广播回调到请求者
		return t.signalResume.Broadcast(ctx)
	} else {
		return ErrorInvalidState.New(nil) // 如果状态已改变（比如已经正常运行），返回错误指示无效的状态转换
	}
}

// PauseSignal 方法返回一个通道用于接收当配置管理器处于暂停状态时的信号。
func (t *Config) PauseSignal() <-chan struct{} { return t.signalPause.Channel() }

// ResumeSignal 方法返回一个通道用于接收当配置管理器从暂停状态恢复时的信号。
func (t *Config) ResumeSignal() <-chan struct{} { return t.signalResume.Channel() }

// 状态常量，表示正常运行（0）和暂停（1）
const (
	stateNormal = iota // 正常运行状态
	statePause         // 暂停状态
)
